module klang.klang.转换工厂.转换为IR.类型.KToIR类型_;
import 全局;
import std.conv: ·to = to;
import klang.编译.核心.核心_: 词典_, 创建数组, 连接;
import klang.编译.语法节点.节点_: 基础节点_ = 节点_, 基础源文件_ = 源文件_;
import klang.ir.语法节点.IR节点_: IR节点_;
import klang.编译.类型.枚举值.枚举值_: 字符_;
class 未整合IR源文件_ {
    基础源文件_[] 整合的文件;
    IR节点_[] 目标平台及源文件名组;
    IR节点_[] 类型声明组;
    IR节点_[] 全局声明组;
    IR节点_[] 封装声明组;
    IR节点_[] 函数定义组;
    IR节点_[] 函数声明组;
    IR节点_[] 特性声明组;
    IR节点_[] 元数据声明组;
    this() {
        this.整合的文件 = 创建数组!(基础源文件_)();
        this.目标平台及源文件名组 = 创建数组!(IR节点_)();
        this.类型声明组 = 创建数组!(IR节点_)();
        this.全局声明组 = 创建数组!(IR节点_)();
        this.封装声明组 = 创建数组!(IR节点_)();
        this.函数定义组 = 创建数组!(IR节点_)();
        this.函数声明组 = 创建数组!(IR节点_)();
        this.特性声明组 = 创建数组!(IR节点_)();
        this.元数据声明组 = 创建数组!(IR节点_)();
    }
}
dstring 转译文本内容(dstring 内容, ref uint 长度) {
    dstring ret = ""d;
    dstring 未转译的 = 创建数组!(immutable(dchar))();
    string chs = ·to!(string)(内容);
    foreach (immutable(char) ch; chs) {
        if (.应该转译((cast(ubyte)(ch)))) {
            if (未转译的.length > 0) {
                ret ~= ·to!(dstring)(未转译的);
                未转译的 = 创建数组!(immutable(dchar))();
            }
            dstring s = .字符转十六进制文本((cast(ubyte)(ch)));
            ret ~= "\\"d ~ s;
            ++长度;
            continue;
        }
        ++长度;
        .追加!(immutable(dchar))(未转译的, ch);
    }
    if (未转译的.length > 0) {
        ret ~= ·to!(dstring)(未转译的);
    }
    return ret;
}
bool 应该转译(ubyte ch) {
    return ch < 33 || ch > 126 || ch == 字符_.反斜杠 || ch == 字符_.双引;
}
dstring 字符转十六进制文本(ubyte ch) {
    dchar a = .整数转十六进制字符(ch / 16);
    dchar b = .整数转十六进制字符(ch % 16);
    return ·to!(dstring)([a, b]);
}
dchar 整数转十六进制字符(int ch) {
    switch (ch) {
        case 0: {
            return cast(dchar)'0';
        }
        case 1: {
            return cast(dchar)'1';
        }
        case 2: {
            return cast(dchar)'2';
        }
        case 3: {
            return cast(dchar)'3';
        }
        case 4: {
            return cast(dchar)'4';
        }
        case 5: {
            return cast(dchar)'5';
        }
        case 6: {
            return cast(dchar)'6';
        }
        case 7: {
            return cast(dchar)'7';
        }
        case 8: {
            return cast(dchar)'8';
        }
        case 9: {
            return cast(dchar)'9';
        }
        case 10: {
            return cast(dchar)'A';
        }
        case 11: {
            return cast(dchar)'B';
        }
        case 12: {
            return cast(dchar)'C';
        }
        case 13: {
            return cast(dchar)'D';
        }
        case 14: {
            return cast(dchar)'E';
        }
        case 15: {
            return cast(dchar)'F';
        }
        default: break;
    }
    return cast(dchar)'0';
}
